Skip to content

[pull] main from microsoft:main#1171

Merged
pull[bot] merged 57 commits intocode:mainfrom
microsoft:main
Apr 22, 2026
Merged

[pull] main from microsoft:main#1171
pull[bot] merged 57 commits intocode:mainfrom
microsoft:main

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented Apr 22, 2026

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

mjbvz and others added 30 commits February 18, 2026 23:14
This reduces the time to get `src` transpiled and fully type checked to around 15seconds on my machine
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Use `tsgo` to run type checks on client for watch
Agents app
- remove settings sync uxcontributions
- add remove button to chat tabs
Add back basic rendering of contributed chat status items
Update distro commit to 0cd3df03

Co-authored-by: vs-code-engineering[bot] <122617954+vs-code-engineering[bot]@users.noreply.github.com>
… grouping (#311728)

* feat: add leakWarningName to emitters with custom leak thresholds

Add emitter name identification to ListenerLeakError and
ListenerRefusalError messages for better error telemetry grouping.

- Add leakWarningName option to EmitterOptions
- Thread emitter name through LeakageMonitor to error constructors
- Prefix error messages with [emitterName] when provided
- Add leakWarningName to all 8 emitters with custom leakWarningThreshold

Ref: #305051

* fix: only prefix error message when explicit leakWarningName is provided

Address Copilot review feedback:
- Derive emitterName by checking if name matches hex-ID pattern;
  pass undefined when it does to preserve backward-compatible messages
- ListenerRefusalError uses this._options?.leakWarningName directly
  instead of the monitor's generated name
- Update doc comment on details field to reflect new grouping behavior
We need to match the new tsgo error format now too
* Support Controller API sessions in Agents App

1. use the new api to create a session
2. make sure those Claude sessions are setting the correct metadata that Agents need
3. document this hidden special contract that we've depended on

Co-authored-by: Copilot <copilot@github.com>

* feedback

* simplify

* feedback

---------

Co-authored-by: Copilot <copilot@github.com>
)

* Add reasoning effort configuration to Claude session management

For the models that have reasoning effort configuration.

* feedback
* Refactor chat send button styles for improved gradient effects and hover interactions

Co-authored-by: Copilot <copilot@github.com>

* Enhance chat send button gradient and animation duration for improved visual effects

Co-authored-by: Copilot <copilot@github.com>

* Update chat input working border colors for improved visibility and consistency

---------

Co-authored-by: mrleemurray <mrleemurray@users.noreply.github.com>
Co-authored-by: Copilot <copilot@github.com>
Remove deprecated properties for chat sessions proposal
…k event (#311718)

- Add dedicated messagesApi.refusal telemetry event that fires on Anthropic
  refusals, capturing the stop_details category (e.g. cyber, content_policy)
- Parse stop_details from message_delta stream events
- Remove messagesApi.unknownContentBlock telemetry which was firing on every
  text content_block_start, producing noise instead of actionable signal
…l-from-source-disposal

Fix InstallFromSourceAction disposal and accessor errors
… before uri (#311752)

* agentHost: fix ah diffs not showing for historic sessions and missing before uri

* test: add listSessions diffs round-trip test coverage
* Don't restore agents window from previous session

The agents window should only be opened via --agents. Previously, if the
agents workspace was the last opened window, window.restoreWindows would
restore it on every subsequent launch, making the agents app 'sticky'.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Inline agents window filter into workspace restore branch

Move the agents workspace check into the existing workspace branch of the
map callback instead of a separate pre-pass over the array.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <copilot@github.com>
TylerLeonhardt and others added 27 commits April 21, 2026 14:22
* Generalize model picker to be used with Claude

So that it has a model picker on the welcome chat.

Co-authored-by: Copilot <copilot@github.com>

* feedback

---------

Co-authored-by: Copilot <copilot@github.com>
* Expose parentSessionId in metadata and use for session grouping

- Add getParentSessionId to IChatSessionMetadataStore interface and implementation
- Include parentSessionId in session item metadata for both worktree and workspace sessions
- Replace SessionsGroupModel with metadata-driven grouping in CopilotChatSessionsProvider
- Derive session groups from parentSessionId in agent session metadata
- Use temp parent mapping for uncommitted sessions during commit flow

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Remove _tempParentChatIds map, derive grouping from selectedOptions

Read parent session ID directly from PARENT_SESSION_OPTION_ID in
selectedOptions for uncommitted sessions instead of maintaining a
separate tracking map.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Delete unused SessionsGroupModel and its tests

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Order grouped chats by creation time

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Add grouping regression tests for Copilot chat sessions

- cover grouping via sessionParentId metadata
- verify chats are ordered by createdAt within a group
- ensure orphaned child sessions are still surfaced

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Stabilize Copilot chat session grouping

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Cache Copilot chat session grouping

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ttern (#311768)

* improve instructions index

Co-authored-by: Copilot <copilot@github.com>

* update

* Update src/vs/workbench/contrib/chat/common/promptSyntax/computeAutomaticInstructions.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Adds a promptTypes property to summarizedConversationHistory telemetry events,
mirroring the same property already on panel.request events. This is a
comma-separated string of role:charCount entries (e.g. system:1234,user:567)
representing each message in the summarization request in order.

This helps correlate cache hit rates with prompt structure divergence across
summarization calls, giving visibility into where prompts diverged from the
previous request.

Changes:
- summarizedConversationHistory.tsx: added promptTypes to sendSummarizationTelemetry
  using post-transformation messages (after strip operations)
- agentIntent.ts: added promptTypes to inline summarization success telemetry
…311600)

* Allow local agent host and Copilot CLI sessions providers to coexist

When chat.agentHost.enabled is true, register both the local agent host
provider and the extension-host Copilot CLI provider instead of
suppressing the latter. Each provider already filters to its own owned
sessions (database-existence on the agent host side, session metadata
origin on the extension side), so the lists are disjoint.

Also tag local agent host workspaces with [Local] in the sidebar to
match the existing remote agent host pattern (${folderName} [${label}]).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Drop [Local] tag from local agent host session type label

The session type id (e.g. `copilotcli`) is shared between the local
agent host and the extension-host Copilot CLI provider, so a single
filter-menu / new-session-picker entry covers sessions from both.
Tagging it as `Copilot [Local]` was misleading. The `[Local]` tag
remains on the per-session workspace label in the sidebar, where it
correctly disambiguates individual sessions.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix merge artifact: remove stale _groupModel reference

The _groupModel property was removed upstream in 6101c49
but one call site survived the merge.

(Written by Copilot)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Changing upgrade hover for Pro users
* Add ChatResponseInfoPart proposed API and stream.info()

Add a new 'info' chat content kind that mirrors the existing 'warning'
path and renders via ChatErrorContentPart with ChatErrorLevel.Info, which
already has blue notification styling (.chat-info-codicon). Expose this
via a new ChatResponseInfoPart proposed API and stream.info() method.

Cherry-picked from 87ce530 (src/vs and src/vscode-dts parts only).

* Disable github.copilot.chat.cli.remote.enabled in agents window

The /remote slash command targets the CLI chat in the main workbench.
Explicitly keep it disabled in the agents sessions app via the session
configurationDefaultsOverrides.

* Adopt types in copilot ext
* Add agent host filter dropdown to Agents web titlebar

Adds a dropdown indicator next to the Toggle Primary Side Bar Visibility
button that shows which remote agent host the workbench is scoped to.
Picking a host (or 'All Hosts') filters the sessions list by providerId.

The UI is web-only; the filter service is registered in common so the
SessionsList DI always resolves (defaults to 'All Hosts' on desktop).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Add connection status indicator to host filter dropdown

Shows a green debug-connected codicon when the selected host is
connected, and a clickable debug-disconnect codicon when disconnected
(clicking it triggers reconnect). While connecting the icon pulses and
is non-interactive. The indicator is only shown when a specific host
is selected (hidden for 'All Hosts').

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Split connect button from host filter dropdown, fill sidebar width

The compound widget now lays out as [dropdown pill][flex-spacer][connect
button] and stretches to fill the left-toolbar-container width, which
already tracks the sidebar width. The connect/disconnect button is a
separate, independently clickable element flush against the right edge
so it lines up with the sidebar's right border (and the chat input
border below it).

The dropdown pill (click to pick host) and the connect button (click
to reconnect when disconnected) have their own hover and click
handlers so each one is clearly actionable.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Update

* update

* Gate web

Co-authored-by: Copilot <copilot@github.com>

* Test fixes and review comments

Co-authored-by: Copilot <copilot@github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <copilot@github.com>
* Fix listener leak in FocusSessionActionViewItem

Listeners added to debug sessions (onDidChangeName/onDidEndAdapter) in
the constructor were not tied to the view item's lifetime. Since debug
sessions outlive the action view item (recreated on toolbar updates),
each recreation piled more listeners onto the same sessions, eventually
triggering the 'potential listener LEAK detected' warning.

Route all per-session listeners through a DisposableStore owned by the
view item so they are released when the view item is disposed, while
still self-cleaning when the session ends.

Fixes #308534

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Address Copilot review: remove child store from parent on session end

Use sessionListenersStore.delete() instead of sessionListeners.dispose()
so that ended sessions don't accumulate disposed stores in the parent.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Empty commit to retrigger CI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* claude extension contributes dropdown to permission picker

* address comments

* don't add default

* remove context key

* contribute slash commands to api

* dont set default

* Apply suggestion from @TylerLeonhardt

Co-authored-by: Tyler James Leonhardt <2644648+TylerLeonhardt@users.noreply.github.com>

* don't show in permission in cloud

---------

Co-authored-by: Tyler James Leonhardt <2644648+TylerLeonhardt@users.noreply.github.com>
* Lazily create chat code block toolbar (#311561)

The MenuWorkbenchToolBar in CodeBlockPart was created eagerly in the
constructor, which subscribes to the menu's onDidChange and in turn
adds listeners on MenuService's shared hiddenStates emitter and the
context key service. In large chat responses with many code blocks,
this accumulates enough listeners on these 'popular' emitters to trip
the leak-detection threshold (see #311561).

Defer toolbar creation until the user actually interacts with the
code block:
- on mouseenter
- on editor focus (so Tab can reach the toolbar)
- eagerly when screen reader mode is active (so SR can announce it)

Pending setAriaLabel / context values from render() are buffered and
applied when the toolbar is eventually created. Visibility/display
control now operates on the outer toolbar element so it works even
before the inner toolbar exists.

(Written by Copilot)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Skip lazy toolbar creation when hideToolbar is set

Address Copilot review feedback: _ensureToolbar() was creating the
toolbar even for code blocks rendered with hideToolbar:true, which
defeated the purpose of avoiding shared-emitter listeners for
permanently-hidden toolbars.

Gate _ensureToolbar() on currentCodeBlockData?.renderOptions?.hideToolbar
so all entry points (mouseenter, editor focus, screen reader) skip
creation when hidden. render() re-calls _ensureToolbar() when a code
block transitions from hidden to visible while screen reader mode is
on, so SR users still get a Tab-reachable toolbar.

(Written by Copilot)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Respect hideToolbar in _configureForScreenReader

Address Copilot review feedback:
- _configureForScreenReader was unconditionally setting display:'block',
  which would override dom.hide() for hideToolbar:true blocks if SR
  was toggled on after render.
- It also called _ensureToolbar() from the constructor (before any
  render) and after reset(), so pooled/idle instances would eagerly
  attach menu/context-key listeners in SR mode.

Guard the display override on hideToolbar, and only call
_ensureToolbar() once currentCodeBlockData is known. The render() path
still calls _ensureToolbar() in SR mode when the toolbar is visible.

(Written by Copilot)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Respect hideToolbar in non-SR branch of _configureForScreenReader

When SR mode toggles off, the else branch was clearing the wrapper's
display style even when render() had hidden it via hideToolbar. Mirror
the SR path: keep the wrapper hidden when hideToolbar is set.

(Written by Copilot)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…t CLI (#311393)

* Add /remote slash command with Mission Control integration

Adds a /remote slash command to Copilot CLI sessions enabling Mission
Control — allowing users to view and steer their coding session from
github.com.

Key changes:
- Register 'remote' command in CopilotCLICommand type and package.json
- Implement full Mission Control API flow: auth, git context, session
  creation, event exporting, and command polling
- Use module-level shared state (McSharedState map) to persist MC state
  across CopilotCLISession instance recreations
- Stream SDK events to MC every 500ms with event type filtering
- Poll for steering commands every 3s (user_message, abort)
- Show notification popup with 'Open in Browser' button and QR-friendly URL
- Support /remote off for teardown

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix MC history replay and steering

- Replay existing conversation events to MC when /remote starts
- Add persistent on('*') listener for MC events between requests
- Store SDK session ref in shared state for command poller
- Make command poller static to avoid stale instance capture
- Clean up persistent listener on teardown

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Filter history replay to skip session lifecycle events

Only replay user.message, assistant.message, tool.* events during
history replay. Skip session.start and other lifecycle events that
would override the remoteSteerable state.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Route MC steering through VS Code chat UI

Instead of calling SDK send() directly (which doesn't render in the
chat UI), route steering messages through the
workbench.action.chat.openSessionWithPrompt.copilotcli command.
This ensures steering messages from the web UI appear in VS Code's
chat panel with proper rendering.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix CI: remove unused import, fix _sessionResource, update test constructors

- Remove unused IRunCommandExecutionService import and constructor param
- Replace _sessionResource with SessionIdForCLI.getResource(this.sessionId)
- Add IAuthenticationService mock arg to test constructor calls

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Restyle /remote success banner as native info notification (#311516)

Add a new 'info' chat content kind that mirrors the existing 'warning'
path and renders via ChatErrorContentPart with ChatErrorLevel.Info, which
already has blue notification styling (.chat-info-codicon). Expose this
via a new ChatResponseInfoPart proposed API and stream.info() method.

Use the new API in copilotcli's /remote success path so the banner
renders as a native blue info notification card with a persistent
'Open on GitHub' button (vscode.open, no model roundtrip).

* feat: add experimental setting to gate /remote command

Add github.copilot.chat.cli.remote.enabled (default: false) to gate
the /remote slash command behind an experimental setting. The command
is hidden from the UI when disabled, and a runtime guard in
_handleRemoteControl provides a helpful message if somehow invoked.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat: make /remote toggle on repeated invocation

Running /remote when remote is already active now disables it.
Explicit /remote on and /remote off still work as before.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* resolve comments.

Co-authored-by: Copilot <copilot@github.com>

* 💄

Co-authored-by: Copilot <copilot@github.com>

* 💄

Co-authored-by: Copilot <copilot@github.com>

* feat: implement Mission Control API client and integrate with Copilot CLI session management

Co-authored-by: Copilot <copilot@github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Elijah King <elijahwilliamking@icloud.com>
Co-authored-by: Peng Lyu <penn.lv@gmail.com>
Co-authored-by: Copilot <copilot@github.com>
…es (#311786)

- Fix race condition in reviveTerminal where concurrent calls for the
  same terminal URI could create duplicate terminal instances. Use a
  SequencerByKey to serialize revive calls per URI key so the second
  caller finds the already-created instance.
- Add hideFromUser: true to revived agent host tool terminals so they
  are routed into backgrounded instances instead of terminal groups.
  This makes them appear in the hidden chat terminals UI entry
  (TerminalTabsChatEntry) consistent with regular chat tool terminals.

Fixes #311709

(Commit message generated by Copilot)
* agentHost: use actual filename in diff editor title

Fixes the diff editor showing 'before' as the filename instead of the
actual file being edited when using AHP with CLI.

- Append basename(filePath) to session DB URI path in fileEditTracker
  so the diff editor tab displays the real filename.
- Add _diffUriMapper override in localAgentHostSessionsProvider to map
  URIs through toAgentHostUri for consistent diff editor titles with
  the local agent host.

Fixes #311509

(Commit message generated by Copilot)

* test: add coverage for basename in session-db URI and local diffUriMapper
* Handle things way better

Co-authored-by: Copilot <copilot@github.com>

* See if we can avoid using unknown in test

Co-authored-by: Copilot <copilot@github.com>

* better handle feedback

Co-authored-by: Copilot <copilot@github.com>

---------

Co-authored-by: Copilot <copilot@github.com>
* Fix remote agent host protocol client lifecycle (Written by Copilot)

* Address remote client disposal review feedback (Written by Copilot)
Bump @github/copilot in root and remote package.json to ^1.0.28 to match
the version pinned by the bundled copilot extension (extensions/copilot).

Also adds a real-SDK integration test for listModels that subscribes to
the root state, authenticates, and asserts every model has a well-formed
shape (id, name, numeric maxContextWindow). This guards against SDK
schema drift like the issue in 1.0.34, where the server returned models
with optional capabilities.limits, causing _listModels to throw a
TypeError that _refreshModels silently swallowed (resulting in no models
in the UI).

Drive-by: fix stale provider id 'copilot' -> 'copilotcli' in the same
test file.

(Written by Copilot)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix int id.

Co-authored-by: Copilot <copilot@github.com>

* 💄

---------

Co-authored-by: Copilot <copilot@github.com>
* Fix broken sessions list
From #311751

Co-authored-by: Copilot <copilot@github.com>

* fix tests

---------

Co-authored-by: Copilot <copilot@github.com>
Agent host workspace folders surface customizations through AHP
(session state + findAgentSkills), not via filesystem scanning.
Including them in PromptFilesLocator caused a resourceList JSON-RPC
per configured location for every nonexistent .github / .claude
folder on the remote, producing noisy '[RemoteAgentHostProtocol]
Request N failed' / 'Failed to resolve files at location' logs every
discovery cycle.

Filter vscode-agent-host:// folders out of getWorkspaceFolders()

getWorkspaceFolderRoots, findAgentMDsInFolder, and the workspace-root
short-circuit in resolveFilesAtLocation.

(Written by Copilot)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@pull pull Bot locked and limited conversation to collaborators Apr 22, 2026
@pull pull Bot added the ⤵️ pull label Apr 22, 2026
@pull pull Bot merged commit 70d194f into code:main Apr 22, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.